const path = require('path'),
  HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  mode: 'development',
  // 入口
  entry: './src/js/app.js',
  // 出口
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'js/bundle.js',
  },
  // 模块
  module: {
    rules: [
      // js 文件解析，因为项目用到了装饰器，所以需要特殊配置 @babel/plugin-proposal-decorators
      {
        test: /\.js$/,
        exclude: /node_modules/, //要排除哪些目录
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env'], //presets 是一个插件的集合，在编译的时候，会根据需要加载插件
            plugins: [
              //执行的顺序是从右向左，所以基础插件要放在最后
              ['@babel/plugin-proposal-decorators', { legacy: true }],
              ['@babel/plugin-proposal-class-properties', { loose: true }],
              ['@babel/plugin-transform-runtime'],
            ],
          },
        },
      },
      // css 样式文件处理， loader 是从下向上执行
      {
        test: /\.css$/,
        use: [
          {
            loader: 'style-loader',
          },
          {
            loader: 'css-loader',
          },
          {
            loader: 'postcss-loader',
            options: {
              plugins: function () {
                return [autoprefixer('last 5 versions')]
              },
            },
          },
        ],
      },
      // tpl 模板解析 ejs-loader
      {
        test: /\.tpl$/,
        use: [
          {
            loader: 'ejs-loader',
            options: {
              esModule: false,
              variable: 'date',
            },
          },
        ],
      },
    ],
  },
  // 插件
  plugins: [
    // html 压缩处理
    new HtmlWebpackPlugin({
      minify: {
        removeComments: true,
        collapseWhitespace: true,
      },
      filename: 'index.html',
      template: path.resolve(__dirname, 'src/index.html'),
      excludeChunks: ['node_modules'],
      files: {
        js: ['js/bundle.js'],
        chunks: {
          main: {
            entry: 'dist/bundle.js',
          },
        },
      },
    }),
  ],
  // 本地服务配置
  devServer: {
    watchOptions: {
      ignored: /node_modules/,
    },
    host: 'localhost',
    port: 3000,
  },
}
